import axios from 'axios'
import authService from './auth.service'
import tokenService from './tokenManage'
import { router } from '@/router/index'
const api = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL, // 配置基础URL
  // baseURL: 'http://localhost:8000',
  timeout: 30000, // 配置请求超时时间
})

// 请求拦截器
api.interceptors.request.use((config) => {
  // 从存储服务中获取当前的访问令牌
  const token = tokenService.getAccessToken()

  // 如果存在token，则将其添加到请求头的Authorization字段
  // 使用Bearer认证方案，这是JWT的标准使用方式
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
})

api.interceptors.response.use(
  (response) => response,
  async (error) => {
    const originalRequest = error.config
    const hasToken = originalRequest.headers.Authorization || tokenService.getAccessToken()
    const isLoginRequest = originalRequest.url === '/api/login/'
    const isRefreshRequest = originalRequest.url === '/api/refresh/' // 关键：判断是否为刷新Token的请求

    // ================== 新增：处理Refresh Token请求失败的情况 ==================
    if (error.response?.status === 401 && isRefreshRequest) {
      console.error('Refresh Token已失效，清除本地凭证并跳转登录页')
      tokenService.clearTokens() // 清除所有Token
      router.push('/login') // 跳转到登录页
      return Promise.reject({ ...error, isRefreshTokenExpired: true })
    }

    // ================== 原有401处理逻辑（调整条件） ==================
    if (
      error.response?.status === 401 &&
      !originalRequest._retry && // 只重试1次
      hasToken &&
      !isLoginRequest &&
      !isRefreshRequest // 关键：不再对Refresh Token请求进行重试
    ) {
      originalRequest._retry = true
      try {
        const newToken = await authService.refreshToken()
        tokenService.setTokens(newToken, tokenService.getRefreshToken())
        originalRequest.headers.Authorization = `Bearer ${newToken}`
        return api(originalRequest) // 重试原始请求
      } catch (refreshError) {
        // 若刷新Token过程中出错（如网络问题），也清除Token并重定向
        tokenService.clearTokens()
        router.push('/login')
        return Promise.reject({ ...refreshError, isTokenRefreshFailed: true })
      }
    }

    // 无Token的401处理
    if (error.response?.status === 401 && !hasToken) {
      router.push('/login') // 跳转到登录页
      return Promise.reject({ ...error, isUnauthenticated: true })
    }

    return Promise.reject(error)
  },
)
// 导出配置好的axios实例
export default api
